package com.github.paicoding.forum.core.mdc;

import org.slf4j.MDC;

// MDC的生命周期是随着线程的创建而存在，线程的销毁而销毁
// MDC的内容是线程私有的，一个线程的MDC内容不会被其他线程所干扰
// MDC的内容是可以被继承的，一个线程的MDC内容可以被其他线程所继承
// MDC的内容是可以被清除的，一个线程的MDC内容可以被其他线程所清除
// MDC的内容是可以被修改的，一个线程的MDC内容可以被其他线程所修改
// MDC的内容是可以被获取的，一个线程的MDC内容可以被其他线程所获取
// MDC的内容是可以被重置的，一个线程的MDC内容可以被其他线程所重置
// MDC的内容是可以被清除的，一个线程的MDC内容可以被其他线程所清除

/**
 * 这是一个用来操作MDC的MDC工具类，方法都是静态的，方便使用
 * @author YiHui
 * @date 2023/5/29
 */
public class MdcUtil {
    public static final String TRACE_ID_KEY = "traceId";

    // 增加日志上下文信息
    public static void add(String key, String val) {
        MDC.put(key, val);
    }

    // 增加traceId
    public static void addTraceId() {
        // traceId的生成规则，技术派提供了两种生成策略，可以使用自定义的也可以使用SkyWalking; 实际项目中选择一种即可
        MDC.put(TRACE_ID_KEY, SelfTraceIdGenerator.generate());
    }

    public static String getTraceId() {
        return MDC.get(TRACE_ID_KEY);
    }

    public static void reset() {
        String traceId = MDC.get(TRACE_ID_KEY);
        MDC.clear();
        MDC.put(TRACE_ID_KEY, traceId);
    }

    public static void clear() {
        MDC.clear();
    }
}
